package _09_高频题;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class _15_三数之和 {

    // -1, -1, 0, 1, 2, 4
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> lists = new ArrayList<>();
        if (nums.length < 3) return lists;
        // 先对数组排序
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;

            int left = i + 1;
            int right = nums.length - 1;
            // 循环遍历
            while (left < right) {
                int total = nums[i] + nums[left] + nums[right];
                if (total < 0) {
                    // 找到左边第一个不等于它的值
                    // l++
                    // 如果下一个值和当前值相同，跳过
                    left++;
                } else if (total > 0) {
                    // r--
                    right--;
                } else {
                    // 找到元素
                    lists.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    while (left < right && nums[left] == nums[++left]);
                    while (left < right && nums[right] == nums[--right]);
                }
            }
        }
        return lists;
    }

}
